#if !defined(_APP_BUFFER)
#define _APP_BUFFER
#include <pthread.h>
#include <inttypes.h>
/**
 * 小缓冲区
 * 缓冲区  1）空间指针  2）空间总大小  3）当前存储的数据长度
 */
typedef struct
{
   void *ptr;
   int32_t total_size;
   int32_t head_index;
   int32_t tail_index;
} SubBuffer;

/**
 * 大缓冲区
 * 1）两个小缓存区的数组 2）读缓冲的数组下标 写缓冲的数组下标 （读写标识） 3）锁
 */
typedef struct
{
   SubBuffer *sub_buffers[2];
   uint8_t read_index;
   uint8_t write_index;
   pthread_mutex_t read_lock;
   pthread_mutex_t swap_lock;
} Buffer;

/**
 * @brief 初始化缓存
 * 
 * @param total_size 缓存区容量。实际占用双倍内存
 * @return Buffer* 缓存区指针
 */
Buffer *app_buffer_init(int32_t total_size);

/**
 * @brief 向缓存区写入数据
 * 
 * @param buffer 缓存区
 * @param write_data 要写入的数据指针
 * @param write_len 要写入的数据长度
 * @return int32_t 0 成功 -1 空间不够用
 */
int32_t app_buffer_write(Buffer *buffer, void *write_data, int32_t write_len);

/**
 * @brief 从缓存区中读取数据
 * 
 * @param buffer 缓存区
 * @param read_buff 数据存放空间
 * @param read_buff_size 空间大小
 * @return int32_t 成功返回实际读取的大小，0 缓存区空 -1 read_buff不够大
 */
int32_t app_buffer_read(Buffer *buffer, void *read_buff, int32_t read_buff_size);

/**
 * i释放缓冲u区
 */
void app_buffer_free(Buffer *buffer);

#endif // _APP_BUFFER
